package com.relife.common.utils;

import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;

import org.apache.log4j.Logger;
import org.springframework.beans.BeanUtils;

/**
 * 
 * @author WU
 * @date 2016年5月26日 下午3:22:34
 */
public class ReflectUtil {
	public static Logger log = Logger.getLogger("ReflectUtil");

	/***
	 * 
	 * @author WU
	 * @date 2016年5月26日 下午3:30:28
	 * @param entity
	 * @param fieldName
	 * @return
	 */
	public static <T> Object getValue(T t, String fieldName) {
		Object value = null;
		if (t == null || StringUtil.isEmpty(fieldName)) {
			return null;
		}
		try {
			String parentName = null;
			if (fieldName.indexOf(".") != -1) {
				parentName = fieldName.substring(0, fieldName.indexOf("."));
				fieldName = fieldName.substring(parentName.length() + 1, fieldName.length());
				value = ReflectUtil.getValue(t, parentName);
				if (value != null) {
					value = ReflectUtil.getValue(value, fieldName);
				}

			} else {
				PropertyDescriptor pro = BeanUtils.getPropertyDescriptor(t.getClass(), fieldName);
				value = pro.getReadMethod().invoke(t);
			}
		} catch (Exception e) {
			log.error("get " + fieldName + " error " + e);
		}
		return value;
	}

	/**
	 * 
	 * @author WU
	 * @date 2016年5月26日 下午3:36:08
	 * @param t
	 * @param fieldName
	 * @param value
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws Exception
	 */
	public static <T> void setValue(T t, String fieldName, Object value) {
		try {
			PropertyDescriptor pro = BeanUtils.getPropertyDescriptor(t.getClass(), fieldName);
			value = pro.getWriteMethod().invoke(t, value);
		} catch (Exception e) {
			log.error(StringUtil.exception2String(e));
		}
	}

	/**
	 * 拷贝非空的值到目标对象
	 * 
	 * @author WU
	 * @date 2016年6月8日 上午11:15:28
	 * @param source
	 * @param target
	 */
	public static void copyNotNullPro2Bean(Object source, Object target) {
		PropertyDescriptor[] pdp = BeanUtils.getPropertyDescriptors(source.getClass());
		for (int i = 0; i < pdp.length; i++) {
			String name = pdp[i].getName();
			if ("class".equals(name)) {
				continue;
			}
			Object value = ReflectUtil.getValue(source, name);
			PropertyDescriptor pro = BeanUtils.getPropertyDescriptor(target.getClass(), name);
			if (pro != null && value != null && !"null".equals(value.toString().trim())) {
				ReflectUtil.setValue(target, name, value);
			}
		}
	}
}
